<?php
/*
19-10-11 
Copyright (c) 2011, Yonel Meza Avila
All rights reserved.
Liberado bajo licencia New BSD License (BSD) 


Definición de las funciones (servicios) del servidor
*/

//Inicio de session para las credenciales
session_start ();
$ruta_raiz = "..";
//Cambiar solo para depuración
define ( 'PRODUCCION', ~ E_ALL );
define ( 'DEPURACION', E_ALL & ~ E_NOTICE );
//error_reporting ( DEPURACION );
error_reporting ( PRODUCCION );

//librerias necesarias
require_once ("$ruta_raiz/funciones.php"); //para traer funciones p_get y p_post
include_once ("$ruta_raiz/include/db/ConnectionHandler.php");
include_once ("$ruta_raiz/config.php");

//Función de quipux para generar filtro
function buscar_cadena_web($cadena, $campo) {
	//Arma el query para buscar una cadena separada por espacios en un campo de la bdd quitando las tildes y eñes
	$resp = "";
	$cadena = limpiar_sql ( $cadena );
	$arr_buscar = explode ( " ", $cadena );
	$glue = '';
	foreach ( $arr_buscar as $tmp ) {
		if ($tmp != "") {
			$resp .= " $glue translate(UPPER($campo),'ÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÑ','AEIOUAEIOUAEIOUN')
		      LIKE translate(upper('%" . trim ( $tmp ) . "%'),'ÁÉÍÓÚÀÈÌÒÙÄËÏÖÜÑ','AEIOUAEIOUAEIOUN') ";
			$glue = 'and';
		}
	}
	$resp = (empty ( $resp )) ? 'true' : $resp;
	return $resp;
}
//Función de quipux para generar filtro
function buscar_nombre_cedula_web($cadena) {
	return '((' . buscar_cadena_web ( $cadena, "usua_nombre" ) . ') or (' . buscar_cadena_web ( $cadena, "usua_cedula" ) . '))';
}
//Función para libpiar cadenas de texto
function tmp_fn_limpiar($cadena) {
	$carac = array ("\\", "'" );
	$cadena = str_replace ( $carac, "", $cadena );
	$cadena = htmlspecialchars ( $cadena );
	return $cadena;
}
/*Función para comprobar credenciales
	Parametros:
		user: usuario (login, normalmente la cédula)
		pass: contraseña del usuario, debe estar en md5
	Resultado:
		true: si el usuario y la contreseña son correctos
		false: si el usuario y la contreseña son incorrectos
	Función: 
		Uso interno del servidor, se debe ejecutar en todos los servicios que requieran autenticación
		Guarda en la variable se session los datos del usuario en el índice user		
*/
function loguser($user, $pass) {
	$ruta_raiz = "..";
	$db = new ConnectionHandler ( "$ruta_raiz" );
	$db->conn->SetFetchMode ( ADODB_FETCH_ASSOC );
	$pass = tmp_fn_limpiar ( $pass );
	$user = tmp_fn_limpiar ( $user );
	$query = "SELECT * FROM USUARIO WHERE USUA_LOGIN =? and inst_estado=1";
	$stmn = $db->conn->Prepare ( $query );
	$rs2 = $db->conn->Execute ( $stmn, array ($user ) );
	if ($rs2->EOF) {
		return false;
	} else if ($rs2->fields ['USUA_PASW'] == SUBSTR ( $pass, 1, 26 )) {
		$_SESSION ['user'] = $rs2->fields;
		return true;
	} else
		return false;
}
/*Función para obtener usuarios (usuarios y ciudadanos)
	Parametros:
		user: Usuario
		password: Contraseña del usuario
		name: filtro tipo like para el nombre del usuario
	Resultado
		Arreglo de clave,valor con los usuarios y su id
	Funcionalidad:
		Obtener usuarios para enviar documentos
*/
function get_usuarios($user, $pass, $name = '') {
	if (! loguser ( $user, $pass )) {
		return array (array ('Clave' => 'Error', 'Valor' => "Credenciales incorrectas" ) );
	}
	$buscar_car = '';
	$ruta_raiz = "..";
	$db = new ConnectionHandler ( "$ruta_raiz" );
	$db->conn->SetFetchMode ( ADODB_FETCH_ASSOC );
	
	$name = trim ( limpiar_sql ( $name ) );
	$buscar_car = trim ( limpiar_sql ( $buscar_car ) );
	$valores = array ();
	$sql = "";
	$usr_sesion = ", '" . date ( 'Y-m-d' ) . "'::date - coalesce(substr(g.usua_fech_sesion::text,1,10), '2010-01-01')::date as \"uso\" ";
	$usr_tipo = ", (CASE WHEN u.inst_codi=0 THEN 3 ELSE (CASE WHEN u.inst_codi=? THEN 1 ELSE 2 END) END) as \"usua_tipo\" ";
	$valores [] = $_SESSION ['user'] ["INST_CODI"];
	$sql = "select u.* $usr_tipo $usr_sesion 
            from datos_usuarios u left outer join usuarios_sesion g on u.usua_codi=g.usua_codi
            where u.usua_esta<>0 ";
	$sql .= ' and ' . buscar_nombre_cedula_web ( $name );
	$sql .= ' and ' . buscar_cadena_web ( $buscar_car, "usua_cargo" );
	if (isset ( $buscar_tipo ) && $buscar_tipo != 0) {
		$sql .= " and u.tipo_usuario=? ";
		$valores [] = $buscar_tipo;
	}
	
	if (isset ( $buscar_tipo ) && $buscar_inst != "0" && ($buscar_tipo == 1 || $buscar_tipo == 0)) {
		$sql .= " and u.inst_codi=?";
		$valores [] = $buscar_inst;
	}
	
	if (isset ( $buscar_tipo ) && isset ( $buscar_depe ) && $buscar_depe != "0" && ($buscar_tipo == 1 || $buscar_tipo == 0)) {
		$sql .= " and u.depe_codi=?";
		$valores [] = $buscar_depe;
	}
	
	$sql .= " and upper(u.usua_login) not like 'UADM%' and u.usua_codi>0
	and u.usua_login != ?";
	$valores [] = $user;
	$sql .= " order by u.usua_nombre asc limit 300 offset 0";
	
	$stmn = $db->conn->Prepare ( $sql );
	$rs2 = $db->conn->Execute ( $stmn, $valores );
	$usuarios = array ();
	while ( ! $rs2->EOF ) {
		$usuarios [] = array ('Clave' => '-' . $rs2->fields ['USUA_CODI'] . '-', 'Valor' => $rs2->fields ['USUA_NOMBRE'] );
		$rs2->MoveNext ();
	}
	return $usuarios;
}
/*Función para obtener tipos de documentos
	Parametros:
		user: Usuario
		password: Contraseña del usuario
	Resultado
		Arreglo de clave,valor con los tipos de documentos y su id
	Funcionalidad:
		Obtener tipos de documentos para la metadata
*/
function get_tipo_documento($user, $pass) {
	if (! loguser ( $user, $pass )) {
		return array (array ('Clave' => 'Error', 'Valor' => "Credenciales incorrectas" ) );
	}
	$buscar_car = '';
	$ruta_raiz = "..";
	$db = new ConnectionHandler ( "$ruta_raiz" );
	$db->conn->SetFetchMode ( ADODB_FETCH_ASSOC );
	$query = "Select trad_descr, trad_codigo from tiporad where trad_tipo='S' ";
	$rs = $db->query ( $query );
	$tmp = "";
	$tipos = array ();
	while ( ! $rs->EOF ) {
		$tipos [] = array ('Clave' => $rs->fields ['TRAD_CODIGO'], 'Valor' => $rs->fields ['TRAD_DESCR'] );
		$rs->MoveNext ();
	}
	return $tipos;
}
/*Función para obtener categorías
	Parametros:
		user: Usuario
		password: Contraseña del usuario
	Resultado
		Arreglo de clave,valor con las categorías de documentos y su id
	Funcionalidad:
		Obtener categorías de documentos para la metadata
*/
function get_tipo_categoria($user, $pass) {
	if (! loguser ( $user, $pass )) {
		return array (array ('Clave' => 'Error', 'Valor' => "Credenciales incorrectas" ) );
	}
	$buscar_car = '';
	$ruta_raiz = "..";
	$db = new ConnectionHandler ( "$ruta_raiz" );
	$db->conn->SetFetchMode ( ADODB_FETCH_ASSOC );
	$queryCat = "Select cat_descr, cat_codi from categoria";
	$rsCat = $db->query ( $queryCat );
	$cats = array (array ('Clave' => 0, 'Valor' => 'Normal' ) );
	while ( ! $rsCat->EOF ) {
		$cats [] = array ('Clave' => $rsCat->fields ['CAT_CODI'], 'Valor' => $rsCat->fields ['CAT_DESCR'] );
		$rsCat->MoveNext ();
	}
	return $cats;
}
/*Función para recibir la metadata de un archivo enviado
	Parametros:
		user: Usuario
		password: Contraseña del usuario
		referencia: Número de referencia
		asunto: Asunto
		desc_anex: Comentarios del anexo
		raditexto: texto para generar documento por html
		categoria: id de la categoría
		tipo: id del tipo de documento
		para: lista de usarios destino para enviar el documento (-id1--id2--id3-)
		id_documento: id del documento devuelto despues de subirlo al servidor
		nomb_archivo: nombre original del archivo
		enviar_documento: 1 enviar documento, 0 dejar el documento en elaboraión
		obs_envio: observación de envío, soló se debe enviar si enviar_documento es igual 1
	Resultado
		Arreglo de clave,valor con clave='success' -> no hubo problema ó clave='error' y valor='mensaje' si no se pudo crear el archivo
	Funcionalidad:
		Obtener tipos de documentos para la metadata
		Se debe ejecutar luego de hacer el upload a http://servidor/webservice/upload.php
*/
function send_document_metadata($user, $pass, $referencia, $asunto, $desc_anex, $raditexto, $categoria, $tipo, $para, $id_documento, $nomb_archivo, $enviar_documento, $obs_envio, $cc) {
	//Escapado de valores para inserción tipo string
	$referencia = pg_escape_string ( $referencia );
	$asunto = pg_escape_string ( $asunto );
	$desc_anex = pg_escape_string ( $desc_anex );
	$raditexto = pg_escape_string ( $raditexto );
	$categoria = pg_escape_string ( $categoria );
	$tipo = pg_escape_string ( $tipo );
	$para = pg_escape_string ( $para );
	$cc = pg_escape_string ( $cc );
	$bcc = pg_escape_string ( $bcc );
	$nomb_archivo = pg_escape_string ( $nomb_archivo );
	$obs_envio = pg_escape_string ( $obs_envio );
	
	$ruta_raiz = '..';
	require_once ("$ruta_raiz/include/tx/Radicacion.php");
	require_once ("$ruta_raiz/include/tx/Tx.php");
	require_once ("$ruta_raiz/obtenerdatos.php");
	require_once ("$ruta_raiz/anexos_grabar.php");
	$db = new ConnectionHandler ( "$ruta_raiz" );
	$db->conn->SetFetchMode ( ADODB_FETCH_ASSOC );
	if (! loguser ( $user, $pass )) {
		return array ('Clave' => 'Error', 'Valor' => "Credenciales incorrectas" );
	}
	
	$clean = array (); // Esta variable contendrá las validaciones hechas a los campos pasados por el formulario NEW.php via post, get
	$clean ['referencia'] = trim ( limpiar_sql ( $referencia ) );
	$clean ['desc_anex'] = trim ( limpiar_sql ( $desc_anex ) );
	$clean ['raditexto'] = trim ( str_replace ( '\"', '"', limpiar_sql ( $raditexto, 0 ) ) );
	$clean ['asunto'] = trim ( limpiar_sql ( $asunto, 0 ) );
	$clean ['cmb_texto'] = 100;
	
	$usr = ObtenerDatosUsuario ( $_SESSION ['user'] ['USUA_CODI'], $db );
	$hist = new Historico ( $db );
	$tx = new Tx ( $db );
	$institucion = $usr ['institucion'];
	$fecha_doc = date ( 'd/m/Y' );
	$rad = new Radicacion ( $db );
	$rad->radiCuentai = $clean ['referencia'];
	$fecha_gen_doc = substr ( $fecha_doc, 6, 4 ) . "-" . substr ( $fecha_doc, 3, 2 ) . "-" . substr ( $fecha_doc, 0, 2 );
	$rad->radiFechOfic = $fecha_gen_doc;
	$radi_padre = (! isset ( $radi_padre ) || ! $radi_padre) ? 'null' : $radi_padre;
	$rad->radiNumeDeri = trim ( $radi_padre );
	$rad->radiUsuaRadi = $usr ["usua_codi"];
	$rad->radiUsuaAnte = "null";
	$rad->radiDescAnex = $clean ['desc_anex'];
	$rad->radiAsunto = $clean ['asunto'];
	$rad->textTexto = $clean ['raditexto'];
	$rad->textTexto = validar_html ( $clean ['raditexto'] );
	$rad->radiUsuaDest = $para;
	$rad->radiUsuaRem = '-' . $usr ["usua_codi"] . '-';
	$rad->radiCCA = $cc;
	$rad->radiTipo = $tipo;
	$rad->radiUsuaActu = $usr ["usua_codi"];
	$rad->radiInstActu = $usr ["inst_codi"];
	$rad->radiEstado = "1";
	$rad->usar_plantilla = "0";
	$rad->usar_plantilla = (isset ( $_POST ["chk_plantilla"] )) ? "1" : $rad->usar_plantilla;
	$rad->ajust_texto = (isset ( $_POST ["cmb_texto"] )) ? $clean ['cmb_texto'] : "100";
	$rad->radi_tipo_impresion = 1; // Tipo de impresion
	$rad->cod_codi = 0; // Tipo de codificacion
	$rad->cat_codi = $categoria; // Categoría
	$rad->radi_lista_dest = '0'; // Códigos de listas destino
	$rad->ocultar_recorrido = "0";
	$rad->ocultar_recorrido = (isset ( $_POST ["chk_ocultar_recorrido"] )) ? "1" : $rad->ocultar_recorrido;
	$rad->usua_redirigido = 0; // Categoría
	$rad->flagRadiTexto = "0"; //Documento de salida
	$td = 0;
	//Crear el radicado
	$noRad = $rad->newRadicado ( $td, $usr ["depe_codi"], $textrad );
	
	$mensaje = "Se ha registrado el documento No. $textrad";
	$codTx = 2;
	$mens_hist = "Documento Temporal No. $textrad";
	$nurad = $noRad;
	if (! $noRad) {
		return array ('Clave' => 'Error', 'Valor' => "Ha ocurrido un Problema. Verfique los datos e intente de nuevo" );
	}
	if ($noRad == "-1") {
		return array ('Clave' => 'Error', 'Valor' => "Error no se generó un Número de Secuencia o se guardó el documento" );
	}
	//Guardar anexo
	if($id_documento != 0)
	{
		if ($noRad) {
			$hist->insertarHistorico ( $noRad, $usr ["usua_codi"], $usr ["usua_codi"], $mens_hist, $codTx, $comparar_texto );
			$tmp = "";
			$fisico = 0; //Digital
			$imagen = 0;
			$nomb_arch_new = "$nomb_archivo";
			$userfile_new = "tmp/$id_documento";
			
			$temp = GrabarAnexo ( $db, $nurad, $userfile_new, $nomb_arch_new, "", $usr ["usua_codi"], $ruta_raiz, $fisico, $imagen );
			$mens_hist = $nomb_archivo;
			if ($temp == 0) {
				$mens_hist = "No se anexo el archivo " . $mens_hist;
			}
			$codTx = 66;
			$hist->insertarHistorico ( $nurad, $usr ["usua_codi"], $usr ["usua_codi"], $mens_hist, $codTx );
		}
	}
	//Enviar documento
	if ($enviar_documento == '1') {
		$tx = new Tx ( $db );
		$usCodDestino = $tx->envioManualDocumento ( array ($nurad ), $obs_envio );
	}
	//var_dump(10);exit;
	return array ('Clave' => 'Success', 'Valor' => 'Sin errores' );
}
//Función para varlidar html
function validar_html($html) {
	$html = preg_replace ( ':<input (.*?)type=["\']?(hidden|submit|button|image|reset|file)["\']?.*?>:i', '', $html );
	$html = preg_replace ( ':<style.*?>.*?</style>:is', '', $html );
	$html = preg_replace ( ':<img.*?/>:is', '', $html );
	$html = preg_replace ( ':<!--.*?-->:is', '', $html );
	$html = preg_replace ( ':<p .*?>:is', '', $html ); //aumentado por SC para evitar que se dañen las viñetas al pegar desde OOo
	$html = preg_replace ( ':<col .*?>:is', '', $html ); //aumentado por SC para evitar que se dañen las tablas al pegar desde OOo 
	$html = str_replace ( "</p>", "<br />", $html );
	$origen = array ("á", "é", "í", "ó", "ú", "ñ", "Á", "É", "Í", "Ó", "Ú", "Ñ" );
	$destino = array ("&aacute;", "&eacute;", "&iacute;", "&oacute;", "&uacute;", "&ntilde;", "&Aacute;", "&Eacute;", "&Iacute;", "&Oacute;", "&Uacute;", "&Ntilde;" );
	$html = str_replace ( $origen, $destino, $html );
	return $html;
}
